package com.example.demo.arithmetic.datastructure.linkedlist;

/**
 * @Description: 双向链表
 * @Author: LLL
 * @Date: 2020-03-14 12:01
 **/
public class DoubleLinkedList {

    public DoubleNode getHead() {
        return head;
    }

    private DoubleNode head = new DoubleNode("", "", 0);

    public void list() {
        DoubleNode temp = head.next;
        while (temp != null) {
            System.out.println(temp);
            temp = temp.next;
        }
    }

    /**
     * @param add 添加至尾部
     */
    public void add(DoubleNode add) {
        // 1.寻找最后一个节点
        DoubleNode temp = head;
        while (true) {
            if (temp.next == null) {
                break;
            } else {
                temp = temp.next;
            }
        }
        // 2.next指向要添加的节点
        temp.next = add;
        add.pre = temp;
    }

    public void update(DoubleNode nNode) {
        if (head.next == null) {
            System.out.println("链表为空！");
            return;
        }
        // 找到需要修改的节点
        DoubleNode temp = head.next;
        // 是否找到
        boolean flag = false;
        while (true) {
            if (temp == null) { // 遍历结束
                break;
            }
            // 从头开始遍历
            if (temp.no == nNode.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.name = nNode.name;
            temp.nickname = nNode.nickname;
        } else {
            System.out.println("没有匹配的修改项！");
        }

    }

    /**
     * @Description:
     * @Param: * @param dNode
     * @return: void
     * @Author: liull
     * @Date: 2020/3/13
     */
    public void delete(DoubleNode dNode) {
        // 1.找到需要删除的这个节点
        // 2.temp.pre.next = temp.next;
        // 3.temp.next.pre = temp.pre

        if (head.next == null) {
            System.out.println("链表为空！");
            return;
        }
        // 找到需要删除的节点
        DoubleNode temp = head.next;
        // 是否找到
        boolean flag = false;
        while (true) {
            if (temp == null) { // 遍历结束
                break;
            }
            // 从头开始遍历 找到该节点
            if (temp.no == dNode.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            // 2.temp.pre.next = temp.next;
            // 第一个节点不需执行
            if (temp.pre != null) {
                temp.pre.next = temp.next;
            }
            // 3.temp.next.pre = temp.pre
            // 最后一节点不需执行
            if (temp.next != null) {
                temp.next.pre = temp.pre;
            }
        } else {
            System.out.println("没有匹配的删除项！");
        }

    }

    /**
     * @param add 添加至合适的位置
     */
    public void addByOrder(DoubleNode add) {
        // 1.寻找要添加的位置

        // 2.add.next = temp.next

        // 3.temp.next = add
        DoubleNode temp = head;
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
                break;
            }
            if (temp.next.no > add.no) {
                break;
            } else if (temp.next.no == add.no) {
                flag = true;//编号存在
                break;
                //                throw new RuntimeException("node is exist!!!");
            }
            temp = temp.next;// 遍历
        }
        // 2.next指向要添加的节点
        if (!flag) {
            add.next = temp.next;
            temp.next = add;
            add.pre = temp;
        } else {
            System.out.printf("编号%d已存在，不可加\n", add.no);
        }
    }

}
